/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.apis.graphics;

import com.example.android.apis.R;

import android.content.Context;
import android.graphics.*;
import android.graphics.drawable.*;
import android.os.Bundle;
import android.view.*;

import java.io.InputStream;
import java.io.ByteArrayOutputStream;

public class BitmapDecode extends GraphicsActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new SampleView(this));
	}

	private static class SampleView extends View {
		private Bitmap mBitmap;
		private Bitmap mBitmap2;
		private Bitmap mBitmap3;
		private Bitmap mBitmap4;
		private Drawable mDrawable;

		private Movie mMovie;
		private long mMovieStart;

		// Set to false to use decodeByteArray
		private static final boolean DECODE_STREAM = true;

		private static byte[] streamToBytes(InputStream is) {
			ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
			byte[] buffer = new byte[1024];
			int len;
			try {
				while ((len = is.read(buffer)) >= 0) {
					os.write(buffer, 0, len);
				}
			} catch (java.io.IOException e) {
			}
			return os.toByteArray();
		}

		public SampleView(Context context) {
			super(context);
			setFocusable(true);

			java.io.InputStream is;
			is = context.getResources().openRawResource(R.drawable.beach);

			BitmapFactory.Options opts = new BitmapFactory.Options();
			Bitmap bm;

			opts.inJustDecodeBounds = true;
			bm = BitmapFactory.decodeStream(is, null, opts);

			// now opts.outWidth and opts.outHeight are the dimension of the
			// bitmap, even though bm is null

			opts.inJustDecodeBounds = false; // this will request the bm
			opts.inSampleSize = 4; // scaled down by 4
			bm = BitmapFactory.decodeStream(is, null, opts);

			mBitmap = bm;

			// decode an image with transparency
			is = context.getResources().openRawResource(R.drawable.frog);
			mBitmap2 = BitmapFactory.decodeStream(is);

			// create a deep copy of it using getPixels() into different configs
			int w = mBitmap2.getWidth();
			int h = mBitmap2.getHeight();
			int[] pixels = new int[w * h];
			mBitmap2.getPixels(pixels, 0, w, 0, 0, w, h);
			mBitmap3 = Bitmap.createBitmap(pixels, 0, w, w, h,
					Bitmap.Config.ARGB_8888);
			mBitmap4 = Bitmap.createBitmap(pixels, 0, w, w, h,
					Bitmap.Config.ARGB_4444);

			mDrawable = context.getResources().getDrawable(R.drawable.button);
			mDrawable.setBounds(150, 20, 300, 100);

			is = context.getResources()
					.openRawResource(R.drawable.animated_gif);

			if (DECODE_STREAM) {
				mMovie = Movie.decodeStream(is);
			} else {
				byte[] array = streamToBytes(is);
				mMovie = Movie.decodeByteArray(array, 0, array.length);
			}
		}

		@Override
		protected void onDraw(Canvas canvas) {
			canvas.drawColor(0xFFCCCCCC);

			Paint p = new Paint();
			p.setAntiAlias(true);

			canvas.drawBitmap(mBitmap, 10, 10, null);
			canvas.drawBitmap(mBitmap2, 10, 170, null);
			canvas.drawBitmap(mBitmap3, 110, 170, null);
			canvas.drawBitmap(mBitmap4, 210, 170, null);

			mDrawable.draw(canvas);

			long now = android.os.SystemClock.uptimeMillis();
			if (mMovieStart == 0) { // first time
				mMovieStart = now;
			}
			if (mMovie != null) {
				int dur = mMovie.duration();
				if (dur == 0) {
					dur = 1000;
				}
				int relTime = (int) ((now - mMovieStart) % dur);
				mMovie.setTime(relTime);
				mMovie.draw(canvas, getWidth() - mMovie.width(), getHeight()
						- mMovie.height());
				invalidate();
			}
		}
	}
}
